/*

// new Promise()
const fn = () => {}
// console.log(typeof fn)
console.log(fn instanceof Object)
console.log([] instanceof Object)
console.log({} instanceof Object)
console.log("=======")
console.log(fn instanceof Function)
console.log([] instanceof Array)
console.log("=======")
console.log({} instanceof Array)
console.log(fn instanceof Array)
*/

/*
// const fn = () => {}
// const fn = []
const fn = {}
fn.a = "aaa"
fn.b = function () {}
console.log(fn.a)
console.log(fn.b)
*/

// function Object() {}
// new Object()
// new Array()
// new Function()
// new String()

// 构造（对象）函数首字母大写
function Person(name = "张三", age = 23) {
  this.name = name
  this.age = age
}
// 通过原型添加属性
Person.prototype.color = "yellow"
Person.prototype.sayHi = function () {
  console.log("Hi!")
}
// new 完之后就是实例
// Person 是 p1，p1 的原型
let p1 = new Person()
let p2 = new Person("李四", 18)
p1.bbb = "bbb"
console.log(p1)
console.log(p2)
console.log("==========")

console.log(p1.hasOwnProperty("bbb")) // true
console.log(p1.hasOwnProperty("color")) // false

// console.log(p1.bbb)
// console.log(p1.color)
// console.log(p1.toString())
// console.log(p1.valueOf())

// console.log(Person.prototype) // 原型
// 构造函数prototype属性的constructor指向该构造函数的本身
// console.log(Person.prototype.constructor === Person)
// console.log(p1.__proto__) // 隐式原型
// console.log(p2.__proto__ === Person.prototype)


// {}.aaa
// Object.prototype.aaa

// 特例
// Object.prototype.__proto__ 是 null


// Object.prototype
// {}.__proto__
// Array.prototype
// [].__proto__
// Function.prototype
// function f() {}.__proto__


// 实例 instanceof 构造函数
// 实例.__proto__  -> 构造函数.prototype

// js继承是通过原型链体现的

// {} instanceof Array
// [] instanceof Object






